package com.study.sort;

import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import java.util.Arrays;

import static com.study.sort.BubbleSort.exch;
import static com.study.sort.BubbleSort.greater;

// 选择排序
public class SelectionSort
{
    int[] arr = {5, 4, 6, 1, 3, 2};

    // // 2020版数据结构与算法
    @Test
    void sort1()
    {
        for (int i = 0; i < arr.length - 1; i++) {
            // 最小元素的索引默认等于起始索引 i
            int minIndex = i;
            // 看看其它是否有更小的元素
            for (int j = i + 1; j < arr.length; j++) {
                if (greater(arr[minIndex], arr[j])) {
                    // 如果 j 处的元素更小，最小元素的索引更新为 j
                    minIndex = j;
                }
            }
            if (minIndex != i) {
                // 把最小元素交换到起始索引
                exch(arr, minIndex, i);
            }
        }
    }

    // // Java基础 入门到起飞 常见算法
    @Test
    void sort()
    {
        // 每一轮从未排序区间中选择一个最小的元素放到此区间最左侧
        for (int i = 0; i < arr.length - 1; i++) {      // i 表示未排序区间的起始索引。 - 1 是因为 j = i + 1
            // 找出 i 开始的区间中最小的元素的索引
            for (int j = i + 1; j < arr.length; j++) {  // j 表示从起始索引的下一个索引开始遍历所有未排序的元素索引
                if (arr[i] > arr[j]) {
                    // 如果起始索引的元素大于遍历到的元素，则把遍历到的更小的元素交换到起始索引
                    int temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
        }
    }

    @BeforeEach
    void printArrBefore()
    {
        System.out.println(Arrays.toString(arr));
    }

    @AfterEach
    void printArrAfter()
    {
        System.out.println(Arrays.toString(arr));
    }
}
